#include "voda.h"
#include "runtime.h"
#include "context.h"

namespace voda
{
	JSBool MY_PropertyStub (JSContext *cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id,JS::MutableHandle<JS::Value> vp)
	{
		return JS_TRUE;
	}

	JSBool MY_StrictPropertyStub (JSContext *cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JSBool strict, JS::MutableHandle<JS::Value> vp)
	{
		return JS_TRUE;
	}

	JSBool MY_DeletePropertyStub (JSContext *cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JSBool *succeeded)
	{
		*succeeded = true;
		return true;
	}

	JSBool MY_EnumerateStub (JSContext *cx, JS::Handle<JSObject*> obj)
	{
		return JS_TRUE;
	}

	JSBool MY_ResolveStub (JSContext *cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id)
	{
		return JS_TRUE;
	}

	JSBool MY_ConvertStub (JSContext *cx, JS::Handle<JSObject*> obj, JSType type,JS::MutableHandle<JS::Value> vp)
	{
		return JS_ConvertStub(cx, obj, type, vp);
	}

	context::context (runtime const & rt)
		: rt_ (rt)
		, cx_ ()
	{
		runtime::lock const rl (rt);

		JSContext * cx = JS_NewContext (rt, 8192);
		if (cx)
		{
			JS_SetOptions (cx, JSOPTION_VAROBJFIX);
			cx_ = cx;
		}
	}

	context::~context (void)
	{
		runtime::lock const ar (rt_);
		if (cx_)
		{
			JS_DestroyContext (cx_);
		}
	}
}